package reflect.fanxing;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

/**
 * Created by zhj on 15-11-6.
 *
 * 1  声明一个需要被参数化的类或接口
 * 2  使用一个参数化类
 *
 * 运行期 不能获取到参数话类型那个的具体类型参数，但是如果在字段和方法使用参数化类型，你可以获取到这个类型参数
 *      换言之 可以在使用参数类型的地方获取到类型参数
 */
public class Test {


    public static void main(String[] args) throws NoSuchMethodException, NoSuchFieldException {
        Method method = MyClass.class.getMethod("getList", List.class);
        Type returnType = method.getGenericReturnType();//List
        printTypePara("return",returnType);


        Type[] genericParameterTypes = method.getGenericParameterTypes();
        for(Type gene:genericParameterTypes){
            printTypePara("para",gene);
        }

        Field field = MyClass.class.getDeclaredField("list");
        Type genericFieldType = field.getGenericType();
        printTypePara("field",genericFieldType);




    }
    private static void printTypePara(String name,Type type){
        if(type instanceof ParameterizedType){
            ParameterizedType parameterizedType = (ParameterizedType) type;
            Type[] typeArguments = parameterizedType.getActualTypeArguments();
            for(Type typeArgument : typeArguments){
                Class typeArgClass = (Class) typeArgument;
                System.out.println(name+" = " + typeArgClass);//类型参数
            }
        }
    }









    public static class MyClass{
        List<String> list;

        public List<String> getList(List<String> list) {
            return list;
        }
    }
}
